/**
 * @file line_protocol_parser.h
 * @brief Line Protocol解析器 - Telegraf Line Protocol支持
 */

#ifndef KWDB_LINE_PROTOCOL_PARSER_H
#define KWDB_LINE_PROTOCOL_PARSER_H

#include "data_point.h"

#include <string>
#include <vector>
#include <regex>

namespace kwdb {

/**
 * @brief Line Protocol解析器
 * 
 * 提供Telegraf Line Protocol格式的解析和生成功能：
 * - 解析Line Protocol字符串为DataPoint
 * - 将DataPoint转换为Line Protocol字符串
 * - 支持转义字符处理
 * - 支持时间戳解析
 */
class LineProtocolParser {
public:
    /**
     * @brief 构造函数
     */
    LineProtocolParser();
    
    /**
     * @brief 解析Line Protocol字符串
     * @param lineProtocol Line Protocol字符串
     * @return 数据点
     * @throws std::invalid_argument 解析异常
     */
    DataPoint parse(const std::string& lineProtocol);
    
    /**
     * @brief 将数据点转换为Line Protocol字符串
     * @param dataPoint 数据点
     * @return Line Protocol字符串
     */
    std::string toLineProtocol(const DataPoint& dataPoint);
    
    /**
     * @brief 批量解析Line Protocol字符串
     * @param lineProtocols Line Protocol字符串列表
     * @return 数据点列表
     */
    std::vector<DataPoint> parseBatch(const std::vector<std::string>& lineProtocols);
    
    /**
     * @brief 批量转换为Line Protocol字符串
     * @param dataPoints 数据点列表
     * @return Line Protocol字符串列表
     */
    std::vector<std::string> toLineProtocolBatch(const std::vector<DataPoint>& dataPoints);
    
    /**
     * @brief 验证Line Protocol字符串格式
     * @param lineProtocol Line Protocol字符串
     * @return 是否有效
     */
    bool isValid(const std::string& lineProtocol);

private:
    // 正则表达式模式
    std::regex measurementPattern_;
    std::regex tagPattern_;
    std::regex fieldPattern_;
    std::regex timestampPattern_;
    
    /**
     * @brief 初始化正则表达式
     */
    void initializePatterns();
    
    /**
     * @brief 解析measurement和tags
     * @param measurementTags measurement和tags字符串
     * @return 解析结果
     */
    std::pair<std::string, std::map<std::string, std::string>> parseMeasurementAndTags(const std::string& measurementTags);
    
    /**
     * @brief 解析fields
     * @param fieldsStr fields字符串
     * @return fields映射
     */
    std::map<std::string, std::string> parseFields(const std::string& fieldsStr);
    
    /**
     * @brief 解析时间戳
     * @param timestampStr 时间戳字符串
     * @return 时间戳（毫秒）
     */
    int64_t parseTimestamp(const std::string& timestampStr);
    
    /**
     * @brief 转义字符串
     * @param str 原始字符串
     * @return 转义后的字符串
     */
    std::string escapeString(const std::string& str);
    
    /**
     * @brief 反转义字符串
     * @param str 转义后的字符串
     * @return 原始字符串
     */
    std::string unescapeString(const std::string& str);
    
    /**
     * @brief 解析字段值
     * @param valueStr 字段值字符串
     * @return 解析后的值
     */
    std::string parseFieldValue(const std::string& valueStr);
    
    /**
     * @brief 格式化字段值
     * @param value 字段值
     * @return 格式化后的值
     */
    std::string formatFieldValue(const std::string& value);
    
    /**
     * @brief 分割字符串
     * @param str 原始字符串
     * @param delimiter 分隔符
     * @return 分割后的字符串列表
     */
    std::vector<std::string> splitString(const std::string& str, char delimiter);
    
    /**
     * @brief 去除字符串两端空白
     * @param str 原始字符串
     * @return 去除空白后的字符串
     */
    std::string trimString(const std::string& str);
};

} // namespace kwdb

#endif // KWDB_LINE_PROTOCOL_PARSER_H
